package dames;

import java.util.Hashtable;

import org.omg.PortableServer.POA;

import dames.gen.deplacementPionException;
import dames.gen.enumCouleurs;
import dames.gen.joueur;
import dames.gen.partiePOA;
import dames.gen.Pion;
import dames.gen.partiePackage.enumEtat;

class partieImpl extends partiePOA{
	private enumEtat etat;
	private joueur blancs;
	private joueur noirs;
	private Hashtable<String, Pion> listePions;
	
	public partieImpl(joueur blancs, POA poa){
		listePions = new Hashtable<String, Pion>();
		this.blancs = blancs;
		
		initPions();
		etat = enumEtat.ATTENTE_PIONS_NOIRS;
	}
	
	private void initPions(){
		String uniqueid;
		for(int y = 0; y < ((HAUTEUR_PLATEAU / 2) - 1); y++){
			for(int x = 0; x < LARGEUR_PLATEAU; x++){
				if((x % 2) + (y % 2) == 1){
					uniqueid = java.util.UUID.randomUUID().toString();
					listePions.put(uniqueid, new Pion(uniqueid, x, y, enumCouleurs.NOIR, false));
					uniqueid = java.util.UUID.randomUUID().toString();
					listePions.put(uniqueid, new Pion(uniqueid, (LARGEUR_PLATEAU - 1 - x),(HAUTEUR_PLATEAU - 1 - y), enumCouleurs.BLANC, false));
				}
			}
		}
	}
	
	@Override
	public joueur noirs(){
		return noirs;
	}

	@Override
	public joueur blancs(){
		return blancs;
	}

	@Override
	public Pion[] pions() {
		return listePions.values().toArray(new Pion[40]);
	}
	
	@Override
	public enumEtat etat() {
		return etat;
	}
	
	@Override
	public void faire_un_deplacement(String id_pion, int x_arrivee, int y_arrivee, joueur caller)
		throws deplacementPionException{
		
		for (Pion pion : listePions.values()) 
			if(pion.x == x_arrivee && pion.y == y_arrivee)
				throw new deplacementPionException("La place est occupee");
		Pion p = listePions.get(id_pion);
		
		if(caller.equals(blancs)){
			System.out.println("c'est blanc qui a joué");

			if(p.couleur == enumCouleurs.NOIR) 
				throw new deplacementPionException("Ce pion appartient à l'adversaire");
			
			if((Math.abs(x_arrivee - p.x) != 1) || (y_arrivee != (p.y - 1)))
				throw new deplacementPionException("L'emplacement de destination est incorrect");
			
			p.x = x_arrivee;
			p.y = y_arrivee;
			
			
			blancs.attends();
			noirs.a_toi_de_jouer();
		}else if(caller.equals(noirs)){
			System.out.println("c'est noir qui a joué");

			if(p.couleur == enumCouleurs.BLANC) 
				throw new deplacementPionException("Ce pion appartient à l'adversaire");
			
			if((Math.abs(x_arrivee - p.x) != 1) || (y_arrivee != (p.y + 1)))
				throw new deplacementPionException("L'emplacement de destination est incorrect");
			
			p.x = x_arrivee;
			p.y = y_arrivee;
			
			noirs.attends();
			blancs.a_toi_de_jouer();
		}
	}

	public void setNoirs(joueur noirs) {
		if(etat == enumEtat.ATTENTE_PIONS_NOIRS){
			this.noirs = noirs;
			etat = enumEtat.EN_COURS;
		}
	}

	public void setEtat(enumEtat etat) {
		this.etat = etat;
	}

}
